package yiran.agift;
import org.bukkit.plugin.java.JavaPlugin;
import yiran.agift.command.AGiftTabCompleter;
import yiran.agift.command.GiftCommand;
import yiran.agift.command.MailboxCommand;
import yiran.agift.gui.aGiftGUIListener;
import yiran.agift.manager.GiftManager;
import yiran.agift.manager.MailboxManager;
import yiran.agift.output.Logger;
import java.util.Objects;
public final class AGift extends JavaPlugin {
    private static AGift instance;
    private GiftManager giftManager;
    private MailboxManager mailboxManager;
    private GiftEditor giftEditor;

    /**
     * 当插件启用时执行的方法
     * 该方法负责初始化插件的各个方面，包括配置文件的检查和创建、管理器的初始化、命令和事件的注册等
     */
    @Override
    public void onEnable() {
        // 将当前插件实例赋值给静态变量instance，用于全局访问
        instance = this;

        // 初始化日志记录器，以便在整个插件中统一日志输出格式和级别
        Logger.init(this);

        // 检查数据文件夹是否存在，如果不存在则创建
        if (!getDataFolder().exists()) {
            getDataFolder().mkdirs();
        }

        // 将默认配置文件复制到插件的数据文件夹中，以便插件可以读取配置
        saveResource("config.yml", false);

        // 将默认的中文语言文件复制到插件的数据文件夹中，以便插件可以使用本地化文本
        saveResource("lang/zh_CN.yml", false);

        // 初始化插件中的各个管理器，如配置管理器、玩家数据管理器等
        initManagers();

        // 注册插件命令，使插件能够响应玩家输入的指令
        registerCommands();

        // 注册命令补全器，提供命令参数的自动补全功能
        registerTabCompleters();

        // 注册插件事件监听器，使插件能够响应游戏中的各种事件
        registerEvents();

        // 打印插件启动横幅，用于在控制台显示插件启动信息
        Logger.printBanner();

        // 在控制台输出插件启动信息，表明插件已成功启动
        Logger.info("插件已启动");
    }

    /**
     * 在插件被禁用时调用，用于执行清理操作
     * 此方法确保在插件禁用时，所有资源被正确释放，避免资源泄露
     */
    @Override
    public void onDisable() {
        // 如果礼物管理器不为空，则关闭它，以释放可能占用的资源
        if (giftManager != null) giftManager.close();
        // 如果邮箱管理器不为空，则关闭它，以释放可能占用的资源
        if (mailboxManager != null) mailboxManager.close();
        // 记录插件关闭的日志信息，方便问题追踪和调试
        Logger.info("插件已关闭");
    }

    /**
     * 注册指令的Tab补全器
     * <p>
     * 本方法旨在为特定指令配置Tab补全功能，通过设置Tab补全器，玩家在输入指令时可以享受到便捷的补全提示
     */
    private void registerTabCompleters() {
        // 为指令"agift"配置Tab补全器，确保玩家在输入该指令时能够获得补全提示
        Objects.requireNonNull(getCommand("agift")).setTabCompleter(new AGiftTabCompleter());
    }

    /**
     * 注册事件处理器
     * <p>
     * 本方法通过创建一个GiftGUI事件监听器实例，并将其注册到服务器的插件管理器中
     * 这样可以确保插件能够正确响应和处理各种事件
     */
    private void registerEvents() {
        getServer().getPluginManager().registerEvents(new aGiftGUIListener(), this);
    }

    /**
     * 初始化管理器对象
     * 本方法用于创建并初始化应用中所需的各个管理器和编辑器实例
     * 包括礼物管理器、邮箱管理器和礼物编辑器，确保应用能正常执行相应功能
     */
    private void initManagers() {
        // 初始化礼物管理器
        giftManager = new GiftManager();
        // 初始化邮箱管理器
        mailboxManager = new MailboxManager();
        // 初始化礼物编辑器
        giftEditor = new GiftEditor();
    }

    /**
     * 注册命令及其对应的执行器
     * <p>
     * 本方法用于初始化并注册两个游戏内命令：礼物命令和邮箱命令
     * 每个命令都被关联到一个特定的执行器类，这些执行器类负责处理命令执行时的具体逻辑
     */
    private void registerCommands() {
        // 注册礼物命令，将其执行器设置为GiftCommand
        Objects.requireNonNull(getCommand("agift")).setExecutor(new GiftCommand());
        // 注册邮箱命令，将其执行器设置为MailboxCommand
        Objects.requireNonNull(getCommand("mailbox")).setExecutor(new MailboxCommand());
    }

    public static AGift getInstance() { return instance; }
    public GiftManager getGiftManager() { return giftManager; }
    public MailboxManager getMailboxManager() { return mailboxManager; }
    public GiftEditor getGiftEditor() { return giftEditor; }
}


